package net

import (
	"github.com/gorilla/websocket"
	"log"
	"net/http"
)

type server struct {
	addr   string
	router *router
}

func NewServer(addr string) *server {
	return &server{
		addr: addr,
	}
}

// Start 启动服务
func (s *server) Start() {
	http.HandleFunc("/", s.wsHandler)
	err := http.ListenAndServe(s.addr, nil)
	if err != nil {
		panic(err)
	}
}

// http协议升级websocket协议配置
var wsUpgrader = websocket.Upgrader{
	// 允许所有CORS跨域请求
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

func (s *server) wsHandler(w http.ResponseWriter, r *http.Request) {
	// 思考 websocket
	// 1.http协议升级websocket协议
	wsConn, err := wsUpgrader.Upgrade(w, r, nil)
	if err != nil {
		// panic(err)
		log.Fatal("websocket服务连接出错", err)
	}

	log.Println("websocket服务连接成功")
	// websocket通道建立之后 不管是客户端还是服务端 都可以收发消息
	// 发送消息的时候   把消息当做路由 来去处理 消息是有格式的  先定义消息的格式
	// 客户端 发送消息的时候 json格式 收到消息后 进行解析 认为要处理的逻辑
	//err = wsConn.WriteMessage(websocket.BinaryMessage, []byte("hello world"))
	//if err != nil {
	//	// panic(err)
	//	log.Fatal("websocket服务发送消息出错", err)
	//}

	wsServer := NewWsServer(wsConn)
	wsServer.Router(s.router)
	wsServer.Start()

}
